package com.zhang.gulimall.product.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zhang.gulimall.product.entity.AttrEntity;
import com.zhang.gulimall.product.entity.SkuInfoEntity;
import com.zhang.gulimall.product.service.SkuInfoService;
import com.zhang.gulimall.product.vo.SkuItemVo;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zhang.gulimall.common.utils.PageUtils;
import com.zhang.gulimall.common.utils.Query;

import com.zhang.gulimall.product.dao.SkuSaleAttrValueDao;
import com.zhang.gulimall.product.entity.SkuSaleAttrValueEntity;
import com.zhang.gulimall.product.service.SkuSaleAttrValueService;

import javax.annotation.Resource;


@Service("skuSaleAttrValueService")
public class SkuSaleAttrValueServiceImpl extends ServiceImpl<SkuSaleAttrValueDao, SkuSaleAttrValueEntity> implements SkuSaleAttrValueService {

    @Resource
    SkuInfoService skuInfoService;

    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        IPage<SkuSaleAttrValueEntity> page = this.page(
                new Query<SkuSaleAttrValueEntity>().getPage(params),
                new QueryWrapper<>()
        );

        return new PageUtils(page);
    }

    @Override
    public List<SkuItemVo.SkuItemSaleAttrVo> getSaleAttrsBySpuId(String spuId) {
        List<SkuItemVo.SkuItemSaleAttrVo> skuItemVos = new ArrayList<>();
        // 根据spuId获取所有skuId
        QueryWrapper<SkuInfoEntity> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(SkuInfoEntity::getSpuId, spuId);
        List<SkuInfoEntity> skuInfoEntityList = skuInfoService.list(queryWrapper);
        List<String> skuIds = skuInfoEntityList.stream().map(SkuInfoEntity::getSkuId).collect(Collectors.toList());
        // 根据skuId获取对应的所有销售属性
        QueryWrapper<SkuSaleAttrValueEntity> queryWrapper1 = new QueryWrapper<>();
        queryWrapper1.lambda().in(SkuSaleAttrValueEntity::getSkuId, skuIds);
        List<SkuSaleAttrValueEntity> list = this.list(queryWrapper1);
        // 获取所有attrId,根据attrId进行分类
        List<String> ids = list.stream().map(SkuSaleAttrValueEntity::getAttrId).distinct().collect(Collectors.toList());
        ids.forEach(id -> {
            SkuItemVo.SkuItemSaleAttrVo skuItemVo = new SkuItemVo.SkuItemSaleAttrVo();
            // 获取对应attrId的实体类
            List<SkuSaleAttrValueEntity> c1 = list.stream().filter(entity -> entity.getAttrId().equals(id)).distinct().collect(Collectors.toList());
            // 获取对应attrId的实体类的所有属性值
            List<String> c2 = c1.stream().map(SkuSaleAttrValueEntity::getAttrValue).distinct().collect(Collectors.toList());
            // 根据属性值获取对应的所有skuId
            List<SkuItemVo.AttrValueWithSkuIds> c3 = c2.stream().map(attr -> {
                SkuItemVo.AttrValueWithSkuIds attrValueWithSkuIds = new SkuItemVo.AttrValueWithSkuIds();
                // 获取attrId 对应的所有skuId
                List<String> skuId = list.stream().filter(entity -> entity.getAttrValue().equals(attr)).map(SkuSaleAttrValueEntity::getSkuId).collect(Collectors.toList());
                // 设置内容
                attrValueWithSkuIds.setAttrValue(attr);
                attrValueWithSkuIds.setSkuIds(skuId);
                return attrValueWithSkuIds;
            }).collect(Collectors.toList());
            // 设置内容
            skuItemVo.setAttrId(id);
            skuItemVo.setAttrName(c1.get(0).getAttrName());
            skuItemVo.setAttrValues(c3);
            skuItemVos.add(skuItemVo);
        });
        return skuItemVos;
    }

    @Override
    public List<String> listSaleAttrsBySkuId(String skuId) {
        List<SkuSaleAttrValueEntity> skuSaleAttrValueEntities = baseMapper.selectList(new LambdaQueryWrapper<SkuSaleAttrValueEntity>().eq(SkuSaleAttrValueEntity::getSkuId, skuId));
        return skuSaleAttrValueEntities.stream().map(a->a.getAttrName()+":"+a.getAttrValue()).collect(Collectors.toList());
    }
}